<?php
/**
 * Глобальный роутер приложения
 * 
 * @category Phorm
 * @package Controller_Route
 * @name /Phorm/Controller/Router/Route.php
 * @copyright phorm.ru
 * @since 21.12.2010
 * @author vladimir@kachalov.net
 */

class Phorm_Controller_Router_Route extends Zend_Controller_Router_Route {
	
	/**
     * Matches a user submitted path with parts defined by a map. Assigns and
     * returns an array of variables on a successful match.
     *
     * @param string $path Path used to match against this routing map
     * @return array|false An array of assigned values or a false on a mismatch
     */

	public function match($path, $partial = false) {
		
		$params = array();
		
		$Mvc = new Phorm_Mvc();
		
		// Проверяем существование идентификатора материала в пути
		// @todo Сделать возможность конфигурирования паттернов урлов материалов
		
		if(preg_match("#^(/.*?)(/([а-яa-z0-9_-]+)\.html)?$#iu",$path,$pathinfo)) {
			
			// Если мы получили идентификатор материала, то устанавливаем CategoriesController
			
			if(isset($pathinfo[3])) {
				
				$params["module"] = "default"; 
				$params["controller"] = "categories"; 
				$params["action"] = "index"; 
				$params["resourceid"] = $pathinfo[3]; 
				$params["categorypath"] = $pathinfo[1]=="/" ? "/" : $pathinfo[1]."/";
				$params["categorypath"] = $pathinfo[1]=="/" ? "/" : $pathinfo[1]."/";

			
			// Иначе получаем модуль, контроллер и действие из родительского math
			
			} else {
				
				$params = parent::match($path, $partial);
				
				// Проверяем существование MVC-ресурса в базе
				
				if($params['mvcinfo'] = $Mvc->getMvcInfo($params)) {
					
					$params['WidgetSetId'] = $params['mvcinfo']['widgetssetid'];
					
					//print_r($params);
					return $params;
				
				// Если MVC-ресурс не найден, то устанавливаем CategoriesController	
					
				} else {
					
					$params["module"] = "default"; 
					$params["controller"] = "categories"; 
					$params["action"] = "index";
					$params["categorypath"] = preg_match("#/$#",$pathinfo[1]) ? $pathinfo[1] : $pathinfo[1]."/";
					
				}
				
			}
			
		}
		
		// После всех экзекуций у нас должны остаться только ресурсы для CategoriesControllerа
		
		$Categories = new Phorm_Categories();
		$Categories->setModule($params["module"]);
		
		// Проверяем существование раздела
		
		if($CategoryInfo = $Categories->getCategoryInfoByPath($params["categorypath"])) {
			
			$params["categoryinfo"] = $CategoryInfo;
			$params["WidgetSetId"]  = $CategoryInfo["widgetssetid"];
			
			// Если мы на главной странице раздела и есть материал для замещения, то переопределяем идентификатор материала
			
			if(!isset($params["resourceid"]) && $CategoryInfo["mainresourceid"]>0) {
				
				$params["resourceid"] = $CategoryInfo["mainresourceid"];	
				
			}
			
			// Проверяем существование материала в текущем разделе и модуле по его идентификатору
			
			if(isset($params["resourceid"])) {
				
				$Resource = new Phorm_Resource();
				$Resource->setModule($params["module"]);
				
				$options = array(
					"categoryid" => $CategoryInfo["categoryid"],
					"moduleid" => $CategoryInfo["moduleid"],
				);
				
				if($ResourceInfo = $Resource->getResourceInfo($params["resourceid"],$options)) {
					
					$params["module"] = "default"; 
					$params["controller"] = $CategoryInfo["modulecontroller"]; 
					$params["action"] = "view";
					$params["resourceinfo"] = $ResourceInfo;
					$params["mvcinfo"] = $Mvc->getMvcInfo($params);
					$params["WidgetSetId"] = $ResourceInfo["widgetssetid"];
					
					//print_r($params);
					return $params;
					
				}
				
			} else {
				
				$params["mvcinfo"] = $Mvc->getMvcInfo($params);
				
				//print_r($params);
				return $params;
				
			}
			
		}
		
		// Все, что не смогло вернуться выше, попадает в ErrorController notfoundAction
			
		$params["module"] = "default"; 
		$params["controller"] = "error"; 
		$params["action"] = "notfound";
		$params["mvcinfo"] = $Mvc->getMvcInfo($params);
		$params["WidgetSetId"] = $params["mvcinfo"]["widgetssetid"];
		
		return $params;

    }

}
